from base.vertice import Vertice
from base.graph import Graph
from dijkstra import Dijkstra

w = dict()  # dicionario dos pesos das arestas, associa um peso a cada aresta!


def weight(pair):
    if pair in w:
        return w[pair]

origem = Vertice('e')
destino = Vertice('x')

linha_1 = [
            Vertice('S11'), Vertice('S12'), Vertice('S13'),
            Vertice('S14'), Vertice('S15'), Vertice('S16'),
            Vertice('S17'), Vertice('S18'), Vertice('S19') 
            ]

linha_2 = [
           Vertice('S21'), Vertice('S22'), Vertice('S23'),
           Vertice('S24'), Vertice('S25'), Vertice('S26'),
           Vertice('S27'), Vertice('S28'), Vertice('S29')
           ]

linha_1_e_2 = []
i = 0
while i < len(linha_1) and i < len(linha_2):
	linha_1_e_2.append(linha_1[i])
	linha_1_e_2.append(linha_2[i])
	i += 1

g = Graph([origem] + linha_1_e_2 + [destino])

# Adicionando as arestas entre os vertices da linha de producao

# Vertice e:
g.add_edge(origem, linha_1[0])
w[(origem, linha_1[0])] = 5
g.add_edge(origem, linha_2[0])
w[(origem, linha_2[0])] = 7

# Vertice S11:
g.add_edge(linha_1[0], linha_1[1])
w[(linha_1[0], linha_1[1])] = 10
g.add_edge(linha_1[0], linha_2[1])
w[(linha_1[0], linha_2[1])] = 14

# Vertice S12
g.add_edge(linha_1[1], linha_1[2])
w[(linha_1[1], linha_1[2])] = 6 
g.add_edge(linha_1[1], linha_2[2])
w[(linha_1[1], linha_2[2])] = 8

# Vertice S13
g.add_edge(linha_1[2], linha_1[3])
w[(linha_1[2], linha_1[3])] = 3
g.add_edge(linha_1[2], linha_2[3])
w[(linha_1[2], linha_2[3])] = 10

# Vertice S14
g.add_edge(linha_1[3], linha_1[4])
w[(linha_1[3], linha_1[4])] = 8 
g.add_edge(linha_1[3], linha_2[4])
w[(linha_1[3], linha_2[4])] = 10

# Vertice S15
g.add_edge(linha_1[4], linha_1[5])
w[(linha_1[4], linha_1[5])] = 5
g.add_edge(linha_1[4], linha_2[5])
w[(linha_1[4], linha_2[5])] = 10

# Vertice S16
g.add_edge(linha_1[5], linha_1[6])
w[(linha_1[5], linha_1[6])] = 3
g.add_edge(linha_1[5], linha_2[6])
w[(linha_1[5], linha_2[6])] = 11

# Vertice S17
g.add_edge(linha_1[6], linha_1[7])
w[(linha_1[6], linha_1[7])] = 7
g.add_edge(linha_1[6], linha_2[7])
w[(linha_1[6], linha_2[7])] = 9

# Vertice S18
g.add_edge(linha_1[7], linha_1[8])
w[(linha_1[7], linha_1[8])] = 12

# Vertice S21
g.add_edge(linha_2[0], linha_2[1])
w[(linha_2[0], linha_2[1])] = 3
g.add_edge(linha_2[0], linha_1[1])
w[(linha_2[0], linha_1[1])] = 9

# Vertice S22
g.add_edge(linha_2[1], linha_2[2])
w[(linha_2[1], linha_2[2])] = 5
g.add_edge(linha_2[1], linha_1[2])
w[(linha_2[1], linha_1[2])] = 6

# Vertice S23
g.add_edge(linha_2[2], linha_2[3])
w[(linha_2[2], linha_2[3])] = 3
g.add_edge(linha_2[2], linha_1[3])
w[(linha_2[2], linha_1[3])] = 10

# Vertice S24
g.add_edge(linha_2[3], linha_2[4])
w[(linha_2[3], linha_2[4])] = 7
g.add_edge(linha_2[3], linha_1[4])
w[(linha_2[3], linha_1[4])] = 10

# Vertice S25
g.add_edge(linha_2[4], linha_2[5])
w[(linha_2[4], linha_2[5])] = 6
g.add_edge(linha_2[4], linha_1[5])
w[(linha_2[4], linha_1[5])] = 12

# Vertice S26
g.add_edge(linha_2[5], linha_2[6])
w[(linha_2[5], linha_2[6])] = 4
g.add_edge(linha_2[5], linha_1[6])
w[(linha_2[5], linha_1[6])] = 8

# Vertice S27
g.add_edge(linha_2[6], linha_2[7])
w[(linha_2[6], linha_2[7])] = 9
g.add_edge(linha_2[6], linha_1[7])
w[(linha_2[6], linha_1[7])] = 14

# Vertice S28
g.add_edge(linha_2[7], linha_2[8])
w[(linha_2[7], linha_2[8])] = 10

# Vertices entrando em X
g.add_edge(linha_1[8], destino)
w[(linha_1[8], destino)] = 8
g.add_edge(linha_2[8], destino)
w[(linha_2[8], destino)] = 9

print('Menor caminho usando dijkstra entre a entrada e a saída da linha de produção: ')

path = ''
result_set = Dijkstra(0,float('inf')).dijkstra(g, weight, origem)    
for v in result_set[destino][::-1]:
    path += str(v.name) + ', '

print(path)
print('Custo: %.2f' %destino.key)
